package com.example.mall.exception;


import com.example.mall.result.JSONResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 全局默认异常处理
     * @param e Exception
     * @return  默认错误提示
     */
    @ExceptionHandler(Exception.class) //用于标记需要处理的异常类型
    public JSONResult exceptionHandler(Exception e) {
        log.error("全局异常处理:{}", e.getMessage(), e);
        return JSONResult.error("系统异常，请稍后再试！");
    }

    /**
     * 全局自定义异常处理
     * @param e 自定义异常
     * @return 自定义错误码+描述
     */
    @ExceptionHandler(GlobalCustomerException.class)
    public JSONResult exceptionHandler(GlobalCustomerException e) {
        log.error("全局自定义异常处理:{},code:{}", e.getMessage(),e.getCode());
        return JSONResult.error(e.getMessage(),e.getCode());
    }

    /**
     * JS303错误
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public JSONResult exceptionHandler(MethodArgumentNotValidException e) {
        log.error("JSR303异常处理:{}", e.getMessage());

        String error=null;
        List<ObjectError> errorList = e.getBindingResult().getAllErrors();
        if (errorList!=null&&errorList.size()>0){
            error = errorList.get(0).getDefaultMessage();
        }

        return JSONResult.errorJSR303(error);
    }
}
